package cn.com.zero.api.auth.vo;

import cn.com.zero.base.constant.DateFormatPatternConstants;
import cn.com.zero.base.vo.BaseVO;
import com.fasterxml.jackson.annotation.JsonFormat;

import java.util.Date;
import java.util.Objects;

/**
 * @author xiongxj
 * @version 1.0.0
 * @Description 在线用户信息VO类
 * @createTime 2023/3/23 10:30
 */
public class OnlineUserVO extends BaseVO implements Cloneable {
    private static final long serialVersionUID = -6513873376953137944L;
    /**
     * 用户ID
     */
    private String userId;

    /**
     * 用户登录设备
     */
    private String loginDevice;

    /**
     * 最后一次的登录时间
     */
    @JsonFormat(pattern = DateFormatPatternConstants.DATE_TIME_MIDDLE_BAR)
    private Date loginTime;

    /**
     * 最后一次的IP地址
     */
    private String loginIp;

    /**
     * 无参构造函数
     */
    public OnlineUserVO() {
    }

    /**
     * 构造函数
     *
     * @param userId      用户ID
     * @param loginDevice 登录设备
     */
    public OnlineUserVO(String userId, String loginDevice) {
        this.userId = userId;
        this.loginDevice = loginDevice;
    }

    /**
     * 构造函数
     *
     * @param userId      用户ID
     * @param loginDevice 登录设备
     * @param loginTime   登录时间
     * @param loginIp     登录ip
     */
    public OnlineUserVO(String userId, String loginDevice, Date loginTime, String loginIp) {
        this.userId = userId;
        this.loginDevice = loginDevice;
        this.loginTime = loginTime;
        this.loginIp = loginIp;
    }

    /**
     * 克隆用户端的在线用户信息
     * 注意：继承此类的子类，需要重写此方法，否则子类中的属性等无法克隆
     *
     * @param onlineUserVO 需要克隆的信息
     * @return 克隆后的用户信息
     */
    public OnlineUserVO clone(OnlineUserVO onlineUserVO) {
        OnlineUserVO onlineUser = null;
        try {
            onlineUser = (OnlineUserVO) super.clone();
        } catch (CloneNotSupportedException e) {
        }
        return onlineUser;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        OnlineUserVO that = (OnlineUserVO) o;
        return userId.equals(that.userId) &&
                loginDevice.equals(that.loginDevice);
    }

    @Override
    public int hashCode() {
        return Objects.hash(userId, loginDevice);
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getLoginDevice() {
        return loginDevice;
    }

    public void setLoginDevice(String loginDevice) {
        this.loginDevice = loginDevice;
    }

    public Date getLoginTime() {
        return loginTime;
    }

    public void setLoginTime(Date loginTime) {
        this.loginTime = loginTime;
    }

    public String getLoginIp() {
        return loginIp;
    }

    public void setLoginIp(String loginIp) {
        this.loginIp = loginIp;
    }
}
